package org.qqcui.designpattern.patterns.singleton.staticinnerclass;

/**
 * 通过静态内部类的方式实现单例模式，既能够保证线程安全，同时能够满足懒加载和效率的要求，在生产环境中推荐使用
 *
 * @author cuiqingqiang
 * @version 1.0
 * @date 2020-10-16 22:14
 **/
public class SingletonTest07 {

	public static void main(String[] args) {
		System.out.println("静态内部类的方式");
		Singleton7 instance1 = Singleton7.getInstance();
		Singleton7 instance2 = Singleton7.getInstance();
		System.out.println(instance1 == instance2);

		System.out.println("instance1.hashCode=" + instance1.hashCode());
		System.out.println("instance2.hashCode=" + instance2.hashCode());
	}
}

class Singleton7 {

	private Singleton7() {

	}

	/**
	 * 外层类加载的时候，不会加载器静态内部类，只有在使用到该静态内部类的时候才会加载类并初始化其属性
	 * 而加载类并初始化属性的时候，是单线程的，不会存在多线程问题
	 * 从JVM层面保证了单例的创建过程
	 */
	private static class SingletonHolder {
		private static final Singleton7 INSTANCE = new Singleton7();
	}

	public static Singleton7 getInstance() {
		return SingletonHolder.INSTANCE;
	}
}